﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using DataAccessComponents;
using BusinessLogicLayer;
using System.Collections.ObjectModel;

namespace inzWeb
{
    public partial class rezerwacja : System.Web.UI.Page
    {
        string id;
        protected void Page_Load(object sender, EventArgs e)
        {
            id = Request.QueryString["idtermin"];

            if (!IsPostBack)
            {
                uzpelnijSzczegoly(id);
                
            }
            

        }

       

        private void uzpelnijSzczegoly(string id)
        {
            
            if (!string.IsNullOrEmpty(id))
            {
                int idtermin = Convert.ToInt32(id);

                TerminBL terminBL = new TerminBL();
                Termin termin = terminBL.pobierz(idtermin);
                MiastoBL miastoBL = new MiastoBL();
                if (termin != null)
                {
                    // Termin
                    lblTerminWylot.Text = string.Format("{0:dd-MM-yyyy}", termin.Data_rozpoczecia);
                    lblTerminPowrot.Text = string.Format("{0:dd-MM-yyyy}", termin.Data_zakonczenia);

                   
                    lblGodzinaWylot.Text = string.Format("{0:hh:mm}", termin.Godzina_wylotu);
                    lblMiejsceWylot.Text = miastoBL.pobierz(termin.Id_miasta_wylotu).Nazwa;
                    lblGodzinaPrzylot.Text = string.Format("{0:hh:mm}", termin.Godzina_wylotu.AddHours(termin.Czas_lotu));
                    lblMiejscePrzylot.Text = miastoBL.pobierz(termin.Id_miasta_celu).Nazwa;

                    
                    lblGodzinaPowrot.Text = string.Format("{0:hh:mm}", termin.Godzina_wylotu_z_celu);
                    lblMiejscePowrot.Text = miastoBL.pobierz(termin.Id_miasta_celu).Nazwa;
                    lblGodzinaPrzylotPowrot.Text = string.Format("{0:hh:mm}", termin.Godzina_wylotu_z_celu.AddHours(termin.Czas_lotu));
                    lblMiejscePrzylotPowrot.Text = miastoBL.pobierz(termin.Id_miasta_wylotu).Nazwa;

                    // Wyzywienie
                    lblWyzywienie.Text = termin.Oferta.Hotel.Wyzywienie.Nazwa;

                    // wybierz liczbe osób w pokoju
                    string[] liczbaOsobWPokoju ={"1 x os. dorosła",
                                                "2 x os. dorosła",
                                                "2 x os. dorosła + 1 x dziecko",
                                                "2 x os. dorosła + 1 x os. dorosła (dostawka)",
                                                "2 x os. dorosła + 2 x dziecko"};
                    ddlLiczbaOsob.DataSource = liczbaOsobWPokoju;
                    
                    // lista odziałów
                    OddzialBL oddzialyBL = new OddzialBL();
                    ddlOddzialy.DataSource = oddzialyBL.pobierzListe();
                   
                    lblCenaZaWybranyPokoj.Text = string.Format("{0:C}",wyliczCeneZaPokoj(termin.Oferta.Cena_dorosly, termin.Oferta.Cena_dziecko, ddlLiczbaOsob.SelectedIndex));
                    
                    // dzieci ponize 2 lat
                    int[] dzieciPoniezej2lat = { 0, 1, 2 };
                    ddlLiczbaDzieci.DataSource = dzieciPoniezej2lat;
                    lblCenaZaDziecko2lata.Text = string.Format("{0:C}", termin.Oferta.Cena_dziecko2lata);

                    // Wypisywanie usług dodatkowych
                    DodatkoweUslugiBL duBL = new DodatkoweUslugiBL();
                    gvuslugiDodatkowe.DataSource = duBL.pobierzListe();
                    

                    // Podsumowanie
                    //lblSuma.Text = sumujRezerwacje().ToString("C");
                    sumujRezerwacje();
                    
                    this.DataBind();

                }

            }
        }
        private void sumujRezerwacje()
        {
            decimal cenaPodsumowanie = 0;

            // cena z pokój
            int idtermin = Convert.ToInt32(id);
            TerminBL terminBL = new TerminBL();
            Termin termin = terminBL.pobierz(idtermin);
            DodatkoweUslugiBL duBL = new DodatkoweUslugiBL();
            cenaPodsumowanie += wyliczCeneZaPokoj(termin.Oferta.Cena_dorosly, termin.Oferta.Cena_dziecko, ddlLiczbaOsob.SelectedIndex);

            // Cena za usługi dodatkowe
            ViewState["uslugiDodatkoweCena"] = new Decimal(0);
            ViewState["uslugiDodatkowe"] = string.Empty;
            foreach (GridViewRow row in gvuslugiDodatkowe.Rows)
            {
                // Dostęp do checkBox
                CheckBox tmp = (CheckBox)row.FindControl("cbZaznaczony");
                Label nazwa = (Label)row.FindControl("lblNazwa");
                Label cena = (Label)row.FindControl("lblCena");

                if (tmp != null && tmp.Checked && nazwa!=null && cena!=null)
                {
                    int id_uslugi = Convert.ToInt32(gvuslugiDodatkowe.DataKeys[row.RowIndex].Value);
                    decimal cenaUslugi = duBL.pobierz(id_uslugi).Cena;
                    cenaPodsumowanie += cenaUslugi;

                    
                    Decimal tmpcena = (Decimal)ViewState["uslugiDodatkoweCena"];
                    tmpcena += cenaUslugi;
                    ViewState["uslugiDodatkoweCena"] = tmpcena;
                    

                    string tmpstr = ViewState["uslugiDodatkowe"].ToString();
                    tmpstr += string.Format("{0} ({1})\n", nazwa.Text, cena.Text);
                    ViewState["uslugiDodatkowe"] = tmpstr;                   
                }
            }

            ViewState["podsumowanie"] = cenaPodsumowanie;
            lblSuma.Text = cenaPodsumowanie.ToString("C");
        }
        public void cbZaznaczony_SelectedChanged(object sender, EventArgs e)
        {
            sumujRezerwacje();
        }

       public void ddlLiczbaOsob_SelectedIndexChanged(object sender, EventArgs e)
        {
            int idtermin = Convert.ToInt32(id);
            DropDownList tmp = (DropDownList)sender;
            TerminBL terminBL = new TerminBL();
            Termin termin = terminBL.pobierz(idtermin);


            lblCenaZaWybranyPokoj.Text = string.Format("{0:C}", wyliczCeneZaPokoj(termin.Oferta.Cena_dorosly, termin.Oferta.Cena_dziecko, tmp.SelectedIndex));
            ViewState["wybranyPokoj"] = tmp.SelectedIndex;
            sumujRezerwacje();
            lblCenaZaWybranyPokoj.DataBind();
        }

        private decimal wyliczCeneZaPokoj(decimal cena, decimal cena_dziecka, int indeksWyboru)
        {
            {
                if (indeksWyboru == 0 || indeksWyboru==-1)
                {
                    return cena;
                }
                else if (indeksWyboru == 1)
                {
                    return 2 * cena;
                }
                else if (indeksWyboru == 2)
                {
                    return 2 * cena + cena_dziecka;
                }
                else if (indeksWyboru == 3)
                {
                    return 3 * cena;
                }
                else if (indeksWyboru == 4)
                {
                    return 2 * cena + 2 * cena_dziecka;
                }
                return 0;


            }
        }

        public void ddlDzien_load(object sender, EventArgs e)
        {
            DropDownList ddl = (DropDownList)sender;

            if (ddl != null)
            {
                
            }
        }

        protected void btnRezerwuj_Click(object sender, EventArgs e)
        {
            panelRezerwacja.Visible = false;
            panelRezerwacjaDaneKlienta.Visible = true;
            // Wyswietlanie miejsc do wprowadzeniea danych osobowych
            ObservableCollection<Klient> lista = new ObservableCollection<Klient>();
       


            Klient klient;
            StatusBL statusBl = new StatusBL();
            int wybranyPokoj = 0;
            if (ViewState["wybranyPokoj"] != null)
                wybranyPokoj = (int)ViewState["wybranyPokoj"];
            else
            {
                wybranyPokoj = 0;
                ViewState["wybranyPokoj"] = wybranyPokoj;
            }
            if (wybranyPokoj == 0 || wybranyPokoj == -1)
            {
                klient = new Klient();
                klient.Id_status = 1;
                klient.Status = statusBl.pobierz(1);
                lista.Add(klient);
            }
            else if (wybranyPokoj == 1)
            {
                klient = new Klient();
                klient.Id_status = 1;
                klient.Status = statusBl.pobierz(1);
                lista.Add(klient);

                klient = new Klient();
                klient.Id_status = 3;
                klient.Status = statusBl.pobierz(3);
                lista.Add(klient);
            }
            else if (wybranyPokoj == 2)
            {
                klient = new Klient();
                klient.Id_status = 1;
                klient.Status = statusBl.pobierz(1);
                lista.Add(klient);

                klient = new Klient();
                klient.Id_status = 3;
                klient.Status = statusBl.pobierz(3);
                lista.Add(klient);

                klient = new Klient();
                klient.Id_status = 2;
                klient.Status = statusBl.pobierz(2);
                lista.Add(klient);
            }
            else if (wybranyPokoj == 3)
            {
                klient = new Klient();
                klient.Id_status = 1;
                klient.Status = statusBl.pobierz(1);
                lista.Add(klient);

                klient = new Klient();
                klient.Id_status = 3;
                klient.Status = statusBl.pobierz(3);
                lista.Add(klient);

                klient = new Klient();
                klient.Id_status = 3;
                klient.Status = statusBl.pobierz(3);
                lista.Add(klient);
            }
            else if (wybranyPokoj == 4)
            {
                klient = new Klient();
                klient.Id_status = 1;
                klient.Status = statusBl.pobierz(1);
                lista.Add(klient);

                klient = new Klient();
                klient.Id_status = 3;
                klient.Status = statusBl.pobierz(3);
                lista.Add(klient);

                klient = new Klient();
                klient.Id_status = 2;
                klient.Status = statusBl.pobierz(2);
                lista.Add(klient);

                klient = new Klient();
                klient.Id_status = 2;
                klient.Status = statusBl.pobierz(2);
                lista.Add(klient);
            }
            
            repeaterDane.DataSource = lista;
            repeaterDane.DataBind();
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            ObservableCollection<Klient> listaKlient = new ObservableCollection<Klient>();
            foreach (RepeaterItem item in repeaterDane.Items)
            {
                if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
                {
                    TextBox tbImie = (TextBox)item.FindControl("tbImie");
                    TextBox tbNazwisko = (TextBox)item.FindControl("tbNazwisko");
                    TextBox tbDataUrodzenia = (TextBox)item.FindControl("tbDataUrodzenia");
                    DropDownList ddlPlec = (DropDownList)item.FindControl("ddlPlec");
                    TextBox tbUlica = (TextBox)item.FindControl("tbUlica");
                    TextBox tbNrDomu = (TextBox)item.FindControl("tbNrDomu");
                    TextBox tbKodPocztowy = (TextBox)item.FindControl("tbKodPocztowy");
                    TextBox tbMiejscowosc = (TextBox)item.FindControl("tbMiejscowosc");
                    
                    Klient klient = new Klient();
                    klient.Adres = new Adres();
                    if (tbImie != null)
                    {
                        klient.Imie = tbImie.Text;
                    }
                    if (tbNazwisko != null)
                    {
                        klient.Nazwisko = tbNazwisko.Text;
                    }
                    if (tbDataUrodzenia.Text != null)
                    {
                        string[] data = tbDataUrodzenia.Text.Split('-');
                        DateTime dt = new DateTime(Int32.Parse(data[2]),Int32.Parse(data[1]),Int32.Parse(data[0]));
                        klient.Data_urodzenia = dt;                        
                    }
                    if (ddlPlec != null)
                    {
                        klient.Plec = ddlPlec.SelectedItem.Text;
                    }
                    if (tbUlica != null)
                    {
                        klient.Adres.Ulica = tbUlica.Text;
                    }
                    if (tbNrDomu != null)
                    {
                        klient.Adres.Nr_domu = tbNrDomu.Text;
                    }
                    if (tbKodPocztowy != null)
                    {
                        klient.Adres.Kod_pocztowy = tbKodPocztowy.Text;
                    }
                    if (tbMiejscowosc != null)
                    {
                        klient.Adres.Miasto = tbMiejscowosc.Text;
                    }
                    
                    

                    listaKlient.Add(klient);
                }
            }

            // id terminu
            int idtermin = Convert.ToInt32(id);

            // Pobieranie informacji o rodzaju pokoju
            int rodzajPokoju = (int)ViewState["wybranyPokoj"];
            int ilosc_doroslych = 0;
            int ilosc_dzieci = 0;

            if (rodzajPokoju == 0 || rodzajPokoju == -1)
            {
                ilosc_doroslych = 1;
                listaKlient[0].Id_status=1;
                
            }
            else if (rodzajPokoju == 1)
            {
                ilosc_doroslych = 2;
                listaKlient[0].Id_status=1;
                listaKlient[1].Id_status=3;
            }
            else if (rodzajPokoju == 2)
            {
                ilosc_doroslych = 2;
                ilosc_dzieci = 1;
                listaKlient[0].Id_status=1;
                listaKlient[1].Id_status=3;
                listaKlient[2].Id_status=2;
            }
            else if (rodzajPokoju == 3)
            {
                ilosc_doroslych = 3;
                listaKlient[0].Id_status=1;
                listaKlient[1].Id_status=3;
                listaKlient[2].Id_status=3;
            }
            else if (rodzajPokoju == 4)
            {
                ilosc_doroslych = 2;
                ilosc_dzieci = 2;
                listaKlient[0].Id_status=1;
                listaKlient[1].Id_status=3;
                listaKlient[2].Id_status=2;
                listaKlient[3].Id_status=2;
            }

            listaKlient[0].Email = tbAdresEmail.Text;
            listaKlient[0].Tel_komorkowy = tbNumerTelefonu.Text;
            listaKlient[0].ZezwolenieEMAIL = cbZezwolenieEmail.Checked;
            listaKlient[0].ZezwolenieSMS = cbZezwolenieSms.Checked;
            // Pobieranie inforamcji  o usługach
             string dodatkoweUslugi = "";
             decimal sumadodatkoweuslugi = 0;
            if (ViewState["uslugiDodatkowe"] != null && ViewState["uslugiDodatkowe"] != null)
            {
               dodatkoweUslugi = ViewState["uslugiDodatkowe"].ToString();
               sumadodatkoweuslugi = (Decimal)ViewState["uslugiDodatkoweCena"];
            }
            decimal suma = (Decimal)ViewState["podsumowanie"];

            TerminBL termBL = new TerminBL();
            Termin termin = termBL.pobierz(idtermin);

            // Dodawanie rezerwacji
            RezerwacjaBL rezerwacjaBL = new RezerwacjaBL();
            Rezerwacja rezerwacja = new Rezerwacja();

            rezerwacja.Id_termin = termin.Id_termin;            
            rezerwacja.Ilosc_doroslych = ilosc_doroslych;
            rezerwacja.Ilosc_dzieci = ilosc_dzieci;
            rezerwacja.Dodatkowe_uslugi = dodatkoweUslugi;
            rezerwacja.Cena_dodatkowe = sumadodatkoweuslugi;
            rezerwacja.Wartosc = suma;


            // Pobieranie oddzialu
            int id_oddzial = Convert.ToInt32(ddlOddzialy.SelectedValue);
            rezerwacja.Id_oddzial = id_oddzial;

            int idRezerwacji = rezerwacjaBL.dodaj(rezerwacja);

            Klient_RezerwacjaBL klientRezerwacja = new Klient_RezerwacjaBL();

            Klient_Rezerwacja kr = new Klient_Rezerwacja();
            KlientBL klientBL = new KlientBL();
            int idklient = 0;
            if (listaKlient.Count == 1)
            {
                idklient = klientBL.dodaj(listaKlient[0]);
                kr.Id_klient = idklient;
                kr.Id_rezerwacja = idRezerwacji;
                kr.Id_status = 1;
                klientRezerwacja.dodaj(kr);
                rezerwacja.Id_klient = idklient;
            }
            else if(listaKlient.Count == 2)
            {
                kr = new Klient_Rezerwacja();
                idklient = klientBL.dodaj(listaKlient[0]);
                kr.Id_klient = idklient;
                kr.Id_rezerwacja = idRezerwacji;
                kr.Id_status = 1;
                klientRezerwacja.dodaj(kr);
                rezerwacja.Id_klient = idklient;

                kr = new Klient_Rezerwacja();
                idklient = klientBL.dodaj(listaKlient[1]);
                kr.Id_klient = idklient;
                kr.Id_rezerwacja = idRezerwacji;
                kr.Id_status = 3;
                klientRezerwacja.dodaj(kr);

            }
            else if (listaKlient.Count == 3 && ilosc_doroslych==2)
            {
                kr = new Klient_Rezerwacja();
                idklient = klientBL.dodaj(listaKlient[0]);
                kr.Id_klient = idklient;
                kr.Id_rezerwacja = idRezerwacji;
                kr.Id_status = 1;
                rezerwacja.Id_klient = idklient;
                klientRezerwacja.dodaj(kr);

                kr = new Klient_Rezerwacja();
                idklient = klientBL.dodaj(listaKlient[1]);
                kr.Id_klient = idklient;
                kr.Id_rezerwacja = idRezerwacji;
                kr.Id_status = 3;
                klientRezerwacja.dodaj(kr);

                kr = new Klient_Rezerwacja();
                idklient = klientBL.dodaj(listaKlient[2]);
                kr.Id_klient = idklient;
                kr.Id_rezerwacja = idRezerwacji;
                kr.Id_status = 2;
                klientRezerwacja.dodaj(kr);
            }
            else if (listaKlient.Count == 3 && ilosc_doroslych == 3)
            {
                kr = new Klient_Rezerwacja();
                idklient = klientBL.dodaj(listaKlient[0]);
                kr.Id_klient = idklient;
                kr.Id_rezerwacja = idRezerwacji;
                kr.Id_status = 1;
                rezerwacja.Id_klient = idklient;
                klientRezerwacja.dodaj(kr);

                kr = new Klient_Rezerwacja();
                idklient = klientBL.dodaj(listaKlient[1]);
                kr.Id_klient = idklient;
                kr.Id_rezerwacja = idRezerwacji;
                kr.Id_status = 3;
                klientRezerwacja.dodaj(kr);

                kr = new Klient_Rezerwacja();
                idklient = klientBL.dodaj(listaKlient[2]);
                kr.Id_klient = idklient;
                kr.Id_rezerwacja = idRezerwacji;
                kr.Id_status = 3;
                klientRezerwacja.dodaj(kr);
            }
            else if (listaKlient.Count == 4)
            {
                kr = new Klient_Rezerwacja();
                idklient = klientBL.dodaj(listaKlient[0]);
                kr.Id_klient = idklient;
                kr.Id_rezerwacja = idRezerwacji;
                kr.Id_status = 1;
                rezerwacja.Id_klient = idklient;
                klientRezerwacja.dodaj(kr);

                kr = new Klient_Rezerwacja();
                idklient = klientBL.dodaj(listaKlient[1]);
                kr.Id_klient = idklient;
                kr.Id_rezerwacja = idRezerwacji;
                kr.Id_status = 3;
                klientRezerwacja.dodaj(kr);

                kr = new Klient_Rezerwacja();
                idklient = klientBL.dodaj(listaKlient[2]);
                kr.Id_klient = idklient;
                kr.Id_rezerwacja = idRezerwacji;
                kr.Id_status = 2;
                klientRezerwacja.dodaj(kr);

                kr = new Klient_Rezerwacja();
                idklient = klientBL.dodaj(listaKlient[3]);
                kr.Id_klient = idklient;
                kr.Id_rezerwacja = idRezerwacji;
                kr.Id_status = 2;
                klientRezerwacja.dodaj(kr);
            }
            rezerwacja.Id_rezerwacja = idRezerwacji;
            rezerwacjaBL.aktualizuj(rezerwacja);


            panelRezerwacjaDaneKlienta.Visible = false;
            panelPotwierdzenie.Visible = true;
        }

        
    }


    
}